package com.lcx.movie.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lcx.movie.common.Rep;
import com.lcx.movie.entity.Cinema;
import com.lcx.movie.entity.Movie;
import com.lcx.movie.mapper.MovieMapper;
import com.lcx.movie.service.CinemaService;
import com.lcx.movie.service.MovieService;
import net.minidev.json.JSONObject;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
 * 电影控制器，用于处理与电影相关的 HTTP 请求。
 * 提供获取电影列表、根据电影 ID 查询电影详情等接口。
 *
 * @author lcx
 * @version 1.0
 * @date 2025/2/11 10:47
 */
@RestController
@CrossOrigin("*") // 允许跨域请求
public class MovieController {

    @Autowired
    private MovieService movieService; // 电影服务

    @Autowired
    private CinemaService cinemaService;
    @Autowired
    private MovieMapper movieMapper; // 电影数据访问对象

    /**
     * 获取电影信息，包括上线和下线的电影，并按票房排序。
     *
     * @return 包含电影信息的 JSON 对象
     */
    @GetMapping("/movie")
    public JSONObject getMovie() {
        JSONObject obj = new JSONObject();

        // 查询上线的电影（状态为 1）
        QueryWrapper<Movie> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("movie_state", 1);
        //排序
        queryWrapper.orderByDesc("movie_releaseDate");
        List<Movie> list = movieMapper.selectList(queryWrapper);
        //3,根据票房排序
        QueryWrapper queryWrapper1 = new QueryWrapper();
        queryWrapper1.eq("movie_state", 1);
        queryWrapper1.orderByDesc("movie_boxoffice");
        List<Movie> list1 = movieMapper.selectList(queryWrapper1);
        //2,下线的电影
        QueryWrapper queryWrapper2 = new QueryWrapper();
        queryWrapper.eq("movie_state", 0);
        List<Movie> list2 = movieMapper.selectList(queryWrapper2);
        //存入obj
        //上线的电影
        obj.put("data", list);
        //下线的电影
        obj.put("data1", list2);
        //票房排序
        obj.put("sort",list1);
        //返回对象
        return obj;
    }

    /**
     * 根据电影 ID 查询电影详情及关联的影院信息。
     *
     * @param movieId 电影 ID
     * @return 包含电影详情和影院信息的 JSON 对象
     */
    @PostMapping("/selectMovieByMovieId")
    public JSONObject selectMovieByMovieId(Integer movieId) {
        System.out.println("movieId = " + movieId);
        JSONObject obj = new JSONObject();
        Movie movie = movieMapper.selectById(movieId);
        //根据电影ID查询电影详情及关联影院信息。
        List<Cinema> cinemas = cinemaService.setCinemasByMovieId(movieId);

        // 将查询结果存入 JSON 对象
        obj.put("data", movie);          // 电影详情
        obj.put("cinemaList", cinemas);  // 关联的影院信息

        return obj;
    }

    /**
     * 分类查询电影
     * @param order
     * @param searchMovie 查询的电影
     * @return jsonObject
     */
    @PostMapping("sortAllMovies")
    public JSONObject sortAllMovies(@Param("order") String order,@Param("searchMovie") String searchMovie) {
        System.out.println("searchMovie = " + searchMovie);
        JSONObject obj = new JSONObject();
        List<Movie> list = new ArrayList<>();
        switch (order) {
            case "热门":
                list = movieService.sortMovieByCount(searchMovie);
                break;
            case "时间":
                list = movieService.sortMovieByDate(searchMovie);
                break;
            case "评价":
                list = movieService.sortMovieByScore(searchMovie);
                break;
        }
        obj.put("code", 0);
        obj.put("count", list.size());
        obj.put("data", list);
        return obj;
    }
    /**
     * 分页条件查询电影列表
     * @param page 当前页
     * @param pageSize 每页显示行数
     * @param movieCnName 电影名称
     * @return 电影集合
     */
    @GetMapping("/selectPageByMovieCnName")
    public Rep selectPageByMovieCnName(@Param("page") int page, @Param("pageSize") int pageSize,
                                       @Param("movieCnName") String movieCnName,@Param("cinemaId") Integer cinemaId){
    // 开始分页
        PageHelper.startPage(page,pageSize);
        // 执行查询
        List<Movie> movieList = movieService.selectPageByMovieCnName(movieCnName,cinemaId);
        PageInfo<Movie> moviePageInfo=new PageInfo<>(movieList);
        return new Rep().addData("moviePageInfo",moviePageInfo);
    }
    /**
     * 根据电影id删除电影
     * @param movieId 电影id
     * @return 受影响的行数
     */
    @GetMapping("/deleteMovieByMovieId")
    public String deleteMovieByMovieId(@Param("movieId") int movieId){
        return movieService.deleteMovieByMovieId(movieId)>0?"删除电影成功":"删除电影失败";
    }
    /**
     * 查询所有电影
     * @return 电影集合
     */
    @GetMapping("/selectMovies")
    public Rep selectMovies(){
        List<Movie> movieList = movieService.selectMovies();
        return new Rep().addData("movieList",movieList);
    }
    /**
     * 新增电影
     * @param movie 电影实体
     * @return 收影响的行数
     */
    @PostMapping("/insertMovie")
    public String insertMovie(Movie movie){
        int insertedMovie = this.movieService.insertMovie(movie);
        if (insertedMovie > 0) {
            return "新增电影成功";
        }else {
            return "新增电影失败";
        }
    }
    /**
     * 根据电影id查出电影对象
     * @param movieId 电影id
     * @return 电影对象
     */
    @GetMapping("/selectMovieByMovieIds")
    public Rep selectMovieByMovieIds(@Param("movieId") Integer movieId){
        List<Movie> movieByMovieId = this.movieService.selectMovieByMovieId(movieId);
        return new Rep().addData("movieByMovieId",movieByMovieId);
    }
    /**
     * 修改电影信息
     * @param movie 电影对象
     * @return 受影响的行数
     */
    @RequestMapping("/updateMovie")
    public String updateMovie(@RequestBody Movie movie){
        return movieService.updateMovie(movie)>0?"修改电影成功":"修改电影失败";
    }
    /**
     * 根据类型，地区，年份 分类查询电影
     * @return 电影集合
     */
    @PostMapping("/getMoviesByType")
    public JSONObject getMoviesByType(@Param("movie_type") String movieType,@Param("movie_country") String movieCountry,@Param("movie_releaseDate") String movieReleaseDate){
        JSONObject obj = new JSONObject();
        List<Movie> moviesByType = movieService.getMoviesByType(movieType, movieCountry, movieReleaseDate);
        obj.put("data", moviesByType);
        obj.put("count",movieCountry.length());
        //System.out.println(movieCountry.length()+"!!!!!!!!!!!!!!!!!!!!!");
        return obj;
    }
    /**
     * 根据电影时间状态判断是：正在热映，即将上映和经典影片
     * @param status 状态
     * @return 电影集合
     */
    @PostMapping("/getMoviesByStatus")
    public JSONObject getMoviesByStatus(@Param("status") String status){
        JSONObject obj = new JSONObject();
        List<Movie> moviesByStatus = movieService.getMoviesByStatus(status);
        obj.put("data", moviesByStatus);
        obj.put("count",moviesByStatus.size());
        return obj;
    }

    /**
     * 分页模糊查询平台电影管理
     * @param movieCnName 电影名
     * @return rep对象
     */
    @GetMapping("/selectMoviePage")
    public Rep selectMoviePage(@Param("page") int page, @Param("pageSize") int pageSize,@Param("movieCnName")String movieCnName,@Param("movieState") Integer movieState) {
        // 开始分页
        PageHelper.startPage(page,pageSize);
        // 执行查询
        List<Movie> movies = movieService.selectMoviePage(movieCnName,movieState);
        PageInfo<Movie> moviePageInfos=new PageInfo<>(movies);
        return new Rep().addData("moviePageInfos",moviePageInfos);
    }

    /**
     * top榜单 根据电影评分来排序
     * @return 电影集合
     */
    @GetMapping("/getMovieScore")
    public JSONObject getMovieScore(){
        JSONObject obj=new JSONObject();
        List<Movie> movieScore = movieService.getMovieScore();
        obj.put("data",movieScore);
        obj.put("count",movieScore.size());
        return obj;
    }
    /**
     * 根据电影id修改电影状态
     * @param movieId 电影id
     * @return 受影响的行数
     */
    @GetMapping("/updateMovieState")
    public String updateMovieState(@Param("movieId") Integer movieId){
        int updateMovieState = movieService.updateMovieState(movieId);
        if (updateMovieState>0){
            return "修改电影状态成功";
        }else {
            return "修改电影状态失败";
        }
    }


}
